perm filename TBOX.FAI[CMS,LCS]2 blob sn#345092 filedate 1978-03-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE TBOX
C00004 00003	INPUT WAIT
C00005 00004	Update LEDs
C00007 00005	 Bit spreading table
C00010 ENDMK
C⊗;
	TITLE TBOX
	.INSERT MAC748.FAI[CMS,LCS]

	T ← 1 ↔	CMD ← 2	↔ N ← 3
	SW0 ← 4	↔ SW1 ← 5 ↔ SW2 ← 6 ↔ AD ← 7

	BRATE ← 21	;BRATE = tBIT / (2.5 * 2)
	OFFSET ← 10	;OFFSET = tBIT / 2 = Center
	LDEF ← 0
	ROW0 ← 357 ↔ ROW1 ← 337
	ON ← 367 ↔ OFF ← 10 ↔ SBITS ← 60

		JMP	RST	;RESET VECTOR
		0
		DISXI		;EXTERNAL INTERRUPT VECTOR
		NOP
		NOP
		NOP
	ERROR:	DISTI		;TIMER INT VECTOR
		RETR

	RST:	MOVI	377	;SETUP INPUT PORTS
		OUTB
		OUTP	1
		OUTP	2

		MOVI	LDEF	;SETUP LED DEFAULT
		CALL	OLED

		JMP	SETFLG

; Reset scan flag and timer
	UPFLG:	STOPT		;STOP TIMER
		DJNZ	T,SETIME
	SETFLG:	MOVRI	T,5	;5 = 100 ms
		CLRF0		;Reset scan flag
		CPLF0
	SETIME:	CLRA		;Reset timer
		MOVAT
		STRTT
		JMP	CKIN
;INPUT WAIT
	INWAIT:	JTF	UPFLG	;CHECK IF TIMER TIME OUT

	CKIN:	JT0H	INWAIT	;CHECK FOR START BIT

		MOVRI	N,OFFSET-2
	CENTER:	DJNZ	N,CENTER	;Wait for center of bit
		JT0H	INWAIT		;Check if valid start bit

		CLRA
		MOVRI	CMD,11	;# of bits -1
	ILOOP:	CALL	IWAIT
		DJNZ	CMD,ILOOP

		ROLC		;Shift out stop bit
		JCC	INWAIT	;Check for good stop bit.

		CALL	OLED	;Update leds

		JF0S	OSWTCH	;Check if time to scan.
		JMP	SCAN

	IWAIT:	MOVRI	N,BRATE-4
	WAIT:	DJNZ	N,WAIT
		CLRC
		JT0H	BITON
		JMP	BITOFF
	BITON:	CPLC
	BITOFF:	RORC
		RET
;Update LEDs
	OLED:	MOVAR	CMD	;Save command
		ORI	7	;Get cal led
		OUTB

		MOVI	16
	CLRL:	OUTB		;Clear led loop
		DECA
		JBS	CLRL

		MOVRA	CMD
		ANDI	7
		OUTB		;Write mode led.
		RET

; Output switches
	OSWTCH:	MOVRA	SW0
		CALL	OBYTE
		MOVRA	SW1
		CALL	OBYTE
		MOVRA	AD
		CALL	OBYTE
		CLRA		;Spare output byte
		CALL	OBYTE
		JMP	INWAIT

; Output Acc. to SI/O line
	OBYTE:	CLRC
		MOVRI	CMD,11	;# of bits -1
	OLOOP:	RORC
		OUTP	2	;Output bit
		MOVRI	N,BRATE-3

	OWAIT:	DJNZ	N,OWAIT
		DJNZ	CMD,OLOOP
		
		MOVI	377
		OUTP	2	;Stop bit
		MOVRI	N,BRATE-3
	SWAIT:	DJNZ	N,SWAIT

		RET
; Bit spreading table
	LOC (. + 377) ∧ 177400
		  0 ↔   1 ↔   4 ↔   5 ↔  20 ↔  21 ↔  24 ↔  25
		100 ↔ 101 ↔ 104 ↔ 105 ↔ 120 ↔ 121 ↔ 124 ↔ 125

	SCAN:	ORBI	SBITS	;Turn off rows
		ANBI	ROW0
		INP	2	;Scan row 0
		MOVAR	SW0	;Save it

		ANI	17	;Get low nibble
		MOVPA		;Get bits from spread table
		XCHAR	SW0
		SWAP		;Swap high low nibbles
		ANI	17	;Get high nibble 
		MOVPA
		MOVAR	SW1

		ORBI	SBITS
		ANBI	ROW1
		INP	2	;Scan row 1

		ANI	17	;Low nibble
		MOVPA
		ROL		;Shift + bits
		ORR	SW0	;Or into - bits
		MOVAR	SW0

		INP	2	;Scan row 1 again
		SWAP
		ANI	17
		MOVPA
		ROL
		ORAR	SW1
		MOVAR	SW1

	ADWAIT:	JT1L	ADWAIT	;Wait for A to D
		
		INB		;Input a/d bits through bus
		MOVAR	AD
		JMP	OSWTCH
END